#include <stdio.h>
#define N 30

int arr[N][N];

int main() {
    int n;
    scanf("%d", &n);
    
    int x = 1;
    for (int i = 0; i < 2 * n - 1; i++) {
        if (i < n) {
            if (i % 2 == 0) {
                for (int j = 0, k = i; k >= 0; j++, k--) {
                    arr[j][k] = x++;
                }
            } else {
                for (int j = i, k = 0; j >= 0; j--, k++) {
                    arr[j][k] = x++;
                }
            }
        } else {//递减斜行
            if (i % 2 == 0) {//偶斜行从最后一列开始，而对应真行的本质就是i-n+1，为什么呢我也不知道数学原理，只能归纳(凑)出来
                for (int j = i - n + 1, k = n - 1; j < n; j++, k--) {
                    arr[j][k] = x++;
                }
            } else {//同理交换行列顺序即可
                for (int j = n - 1, k = i - n + 1; k < n; j--, k++) {
                    arr[j][k] = x++;
                }
            }
        }
    }//以上能实现的标准蛇形矩阵
    //1  3  4  10
    //2  5  9  11
    //6  8  12 15 
    //7  13 14 16
     for (int i =0;i<n; i++) {//行顺序不变
        for (int j=n-1; j>=0;j--) {//列顺序倒着打印
            printf("%5d", arr[j][i]);//仅作i与j交换，矩阵转置变为
            //1 2 6 7
            //3 5 8
            //4 9
            //10
        }
        printf("\n");
    }
    
    return 0;
}


//或者更直接的
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define N 30

int arr[N][N];

int main() {
    int n;
    scanf("%d", &n);

    int x = 1;
    for (int i = 0; i < 2 * n - 1; i++) {
        if (i < n) {
            if (i % 2 == 0) {
                for (int j = i, k = n - 1; j >= 0; j--, k--) {
                    arr[j][k] = x++;
                }
            }
            else {
                for (int j = 0, k = n - 1 - i; j <= i; j++, k++) {
                    arr[j][k] = x++;
                }
            }
        }
        else {
            if (i % 2 == 0) {
                for (int j = n - 1, k = 2 * n - i - 2; k >= 0; j--, k--) {
                    arr[j][k] = x++;
                }
            }
            else {
                for (int j = i - n + 1, k = 0; j <= n - 1; j++, k++) {
                    arr[j][k] = x++;
                }
            }
        }
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%5d", arr[i][j]);
        }
        printf("\n");
    }

    return 0;
}
